import java.util.Scanner;

public class demo06 {
//    问题描述：给定一个N阶矩阵A，输出A的M次幂（M是非负整数）
//    例如：A =1 2
//            3 4
//    A的2次幂
//    7 10
//    15 22
//    输入格式：第一行是一个正整数N、M（1<=N<=30, 0<=M<=5），表示矩阵A的阶数和要求的幂数
//    接下来N行，每行N个绝对值不超过10的非负整数，描述矩阵A的值
//    输出格式：输出共N行，每行N个整数，表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
//    样例输入：2 2
//            1 2
//            3 4
//    样例输出：7 10
//            15 22
    public static void func(int[][] arr1,int[][] arr2,int n){
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr2[i][j]=arr1[i][j];
            }
        }
    }
    public static int[][] func1(int[][] arr,int[][] arr1,int[][] arr2,int n){
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int sum=0;
                for (int k = 0; k < n; k++) {
                    sum+=arr[i][k]*arr1[k][j];
                }
                arr2[i][j]=sum;
            }
        }
        return arr2;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int[][] arr=new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j]=sc.nextInt();
            }
        }
        int[][] arr1=new int[n][n];
        func(arr,arr1,n);
        int[][] arr2=new int[n][n];
        for (int i = 0; i < m; i++) {
            func(arr1,arr2,n);
            arr2=func1(arr,arr1,arr2,n);
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(arr2[i][j]+" ");
            }
            System.out.println();
        }
    }
}
